<?php
/**
 * 以json格式返回值的构造类
 * polewt 
 * 2024.7.18
 */

namespace app\utils;

use think\Response;

class Json extends \think\response\Json
{
    /**
     * 返回成功并可携带数据 默认代码200
     * @param array $data 返回的data数据
     * @param array|null $args 其他的返回值（可以覆盖所有返回值）
     * @return Response
     */
    public static function Success(array $data = [], $args = null): Response
    {
        $config = ['code' => 200, 'message' => '成功', 'data' => $data];
        if ($args) {
            foreach ($args as $k => $v) {
                $config[$k] = $v;
            }
        }
        return self::create($config, 'json');
    }

    /**
     * 返回响应并可携带数据
     * @param string $message 返回的信息
     * @param int $code 返回状态码
     * @param array $args 其他的返回值（可以覆盖所有返回值）
     * @param bool $isTrueError 状态码是否与HTTP状态码一致
     * @return Response
     */
    public static function Msg(string $message = 'Success', int $code = 200, array $args = [], bool $isTrueError = false): Response
    {
        $config = ['code' => $code, 'message' => $message];
        if ($args) {
            foreach ($args as $k => $v) {
                $config[$k] = $v;
            }
        }
        return self::create($config, 'json', $isTrueError ? $code : 200);
    }

    /**
     * 返回列表数据
     * @param array $data 返回的data数据
     * @param int $count 数据总数
     * @param array $args 其他的返回值（可以覆盖所有返回值）
     * @return Response 返回数据列表
     */
    public static function List(array $data = [], int $count = 0, array $args = []): Response
    {
        $config = ['code' => 200, 'message' => '成功', 'data' => $data, 'count' => $count];
        if ($args) {
            foreach ($args as $k => $v) {
                $config[$k] = $v;
            }
        }
        return self::create($config, 'json');
    }

    /**
     * 返回失败可修改状态码
     * @param int $code 状态码
     * @param string|null $message 返回信息
     * @param bool $isTrueError 状态码是否与HTTP状态码一致
     * @param array|null $args 其他的返回值（可以覆盖所有返回值）
     * @return Response
     */
    public static function Error(int $code, $message, bool $isTrueError = false, $args = null): Response
    {
        $config = ['code' => $code, 'message' => $message];
        if ($args) {
            foreach ($args as $k => $v) {
                $config[$k] = $v;
            }
        }
        return self::create($config, 'json', $isTrueError ? $code : 200);
    }

    /**
     * 返回警告是成功的一种
     * @param string $message
     * @return Response
     */
    public static function Warning(string $message = ''): Response
    {
        return self::create(['code' => -2, 'message' => $message], 'json');
    }

    /**
     * 返回layui成功信息
     * @param array $data 返回的data数据
     * @param int $count 数据总数
     * @param array|null $args 其他的返回值（可以覆盖所有返回值）
     * @return Response 返回数据列表
     */
    public static function LayuiSuccess(array $data = [], int $count = 0, array $args = null): Response
    {
        $config = ['code' => 0, 'message' => '成功', 'data' => $data, 'count' => $count];
        if ($args) {
            foreach ($args as $k => $v) {
                $config[$k] = $v;
            }
        }
        return self::create($config, 'json');
    }

    /**
     * 返回layui错误信息
     * @param string $message 返回的信息
     * @param array|null $args 其他的返回值（可以覆盖所有返回值）
     * @return Response 返回错误信息
     */
    public static function LayuiError(string $message = '出错了！', array $args = null): Response
    {
        $config = ['code' => 0, 'message' => $message];
        if ($args) {
            foreach ($args as $k => $v) {
                $config[$k] = $v;
            }
        }
        return self::create($config, 'json');
    }
}
